package cn.fansunion.leecode.array;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import cn.fansunion.leecode.kit.Kit;

/**
 * 存在重复元素
 * 给定一个整数数组，判断是否存在重复元素。

给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ，返回 true ；
如果数组中每个元素互不相同，返回 false 。
https://leetcode-cn.com/problems/contains-duplicate/
 * @author wen.lei@brgroup.com
 *
 * 2022-1-14
 */
public class ContainsDuplicate {
    
    /**
     * 维护每个数字和出现的次数map，找到1个出现1次以上的，true；否则，false
     * @param nums
     * @return
     */
    public boolean containsDuplicate(int[] nums) {
        Map<Integer, Integer> numCountMap =Kit.countMap(nums);
        for (Entry<Integer, Integer> entry : numCountMap.entrySet()) {
            Integer count=entry.getValue();
            //至少存在1个数字，出现2次
            if(count>1) {
                return true;
            }
        }
        //只存在1次
        return false;
    }
    
    /**
     * 把数字全都放到集合set中，集合中的数字和数组中的数字个数相同，说明全部不同；否则，返回false
     * @param nums
     * @return
     */
    public boolean containsDuplicateSet(int[] nums) {
        Set<Integer> set = new HashSet<>();
        for (Integer num : nums) {
            set.add(num);
        }
        return set.size()==nums.length;
    }
    
    
    //list
    public boolean containsDuplicateList(int[] nums) {
        List<Integer> list = new ArrayList<>();
        for (Integer num : nums) {
            if(!list.contains(num)) {
                list.add(num);
            }
        }
        return list.size()==nums.length;
    }
}
